﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Sinacor.Infra.Tools;

namespace RightsRegistrationWeb
{
    public partial class Default : System.Web.UI.Page
    {
        private List<string> vsLstRightType
        {
            get
            {
                if (!object.ReferenceEquals(ViewState["lstrighttype"], null))
                    return (List<string>)ViewState["lstrighttype"];
                else
                    return new List<string>();
            }
            set { ViewState["lstrighttype"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                LoadObjectRightType();
                LoadComboRightType();
                LoadComboOperationType();
                LoadDataGrid(string.Empty);
            }
            else
            {
                if (hdnDeleteAction.Value == "S")
                {
                    DeleteItems();
                    hdnDeleteAction.Value = "";
                }
            }
            LoadModules();
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            btSave.Click += new EventHandler(btSave_Click);
        }

        protected void grdRights_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdRights.PageIndex = e.NewPageIndex;
            btnPesquisar_Click(btnPesquisar, new EventArgs());
        }

        protected void grdRights_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            switch (e.Row.RowType)
            {
                case DataControlRowType.DataRow:

                    Right r = (e.Row.DataItem as Right);

                    Label lbl = (Label)e.Row.FindControl("lblGrdTipoOperacao");
                    if (lbl != null)
                    {
                        string tipoOperacao = (from t in this.vsLstRightType where t.StartsWith(r.CodigoTipoOperacao) select t).ToList().First();
                        lbl.Text = tipoOperacao;
                    }

                    LinkButton lnkDescricaoDireito = (LinkButton)e.Row.FindControl("lnkDescricaoDireito");
                    if (lnkDescricaoDireito != null)
                    {
                        lnkDescricaoDireito.Text = r.DescricaoDireito.Replace("http://www.bovespa.com.br/", "");
                        lnkDescricaoDireito.ToolTip = r.DescricaoDireito;
                        lnkDescricaoDireito.Attributes.Add("onclick", string.Format("GridItemClick('" + grdRights.ClientID + "', '" + e.Row.ClientID + "', '{0}')", r.SiglaModulos));
                    }

                    e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#B2BAC6';");
                    e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#FFFFFF';");

                    //e.Row.Attributes.Add("ondblclick", string.Format("GridItemClick('" + grdRights.ClientID + "', this, '{0}')", r.SiglaModulos));


                    //e.Row.Attributes.Add("onclick", "GridMouseClick('" + grdRights.ClientID + "', '" + r.CodigoDireito.ToString() + "', true)");
                    e.Row.Attributes.Add("codigotipodireito", r.CodigoTipoDireito.ToString());
                    e.Row.Attributes.Add("codigotipooperacao", r.CodigoTipoOperacao.ToString());

                    break;
            }
        }

        void LoadModules()
        {
            List<Module> modules = new DataAccess().LoadModules();
            HtmlTableRow row = new HtmlTableRow(); ;
            Module item;

            for (int i = 0; i < modules.Count; i++)
            {
                item = modules[i];

                HtmlTableCell cellChk = new HtmlTableCell();
                HtmlTableCell cell = new HtmlTableCell();

                CheckBox chk = new CheckBox();
                chk.ID = item.Sigla;
                cellChk.Controls.Add(chk);

                cell.InnerText = item.Sigla;

                row.Cells.Add(cellChk);
                row.Cells.Add(cell);
            }

            tblModules.Rows.Add(row);
        }

        void LoadDataGrid(string pesquisa)
        {
            List<Right> rights = new DataAccess().LoadRights(pesquisa);

            grdRights.DataSource = rights;
            grdRights.DataBind();
        }

        void LoadComboOperationType()
        {
            foreach (string s in this.vsLstRightType)
                cbTipoOperacao.Items.Add(new ListItem(s, s.Substring(0, 1)));
        }

        void LoadObjectRightType()
        {
            this.vsLstRightType = new List<string> { "Create", "Read", "Update", "Delete", "Execute" };
        }

        void LoadComboRightType()
        {
            cbTipoDireito.DataSource = new DataAccess().LoadRightTypes();
            cbTipoDireito.DataTextField = "DescricaoTipoDireito";
            cbTipoDireito.DataValueField = "CodigoTipoDireito";
            cbTipoDireito.DataBind();
        }

        void btSave_Click(object sender, EventArgs e)
        {
            bool IsUpdate = (!String.IsNullOrEmpty(hdnCodigoDireito.Value));

            if (!ValidateModule())
                return;

            try
            {
                if (!String.IsNullOrEmpty(txtDescricao.Text.Trim()))
                {
                    SHA384Managed Alg = new SHA384Managed();
                    Right direito = new Right();
                    List<Module> modules = new List<Module>();
                    DataAccess dataAccess = new DataAccess();

                    if (txtDescricao.Text.Trim().IndexOf("http://www.bovespa.com.br/") > -1)
                        txtDescricao.Text.Replace("http://www.bovespa.com.br/", "");

                    direito.DescricaoDireito = "http://www.bovespa.com.br/" + txtDescricao.Text.Trim();
                    direito.CodigoTipoDireito = Convert.ToInt32(cbTipoDireito.SelectedValue);
                    direito.CodigoTipoOperacao = cbTipoOperacao.SelectedValue;
                    direito.TextoHash = Convert.ToBase64String(Alg.ComputeHash(Encoding.ASCII.GetBytes(direito.DescricaoDireito + "/" + direito.CodigoTipoOperacao)));

                    if (IsUpdate)
                    {
                        direito.CodigoDireito = Convert.ToInt32(hdnCodigoDireito.Value);
                        if (dataAccess.UpdateRight(direito) > 0)
                        {
                            dataAccess.DeleteModule(direito);
                            lblMessage.Text = "<b><font color=#009900>Item \"" + direito.DescricaoDireito + "\" salvo com sucesso!</font></b>";
                            cbTipoDireito.Enabled = true;
                            txtDescricao.Text = "";
                        }
                        else
                            lblMessage.Text = "<b><font color=#990000>Nenhuma linha alterada</font></b>";

                        hdnCodigoDireito.Value = "";
                    }
                    else
                    {
                        if (dataAccess.SaveRight(direito) > 0)
                        {
                            direito.CodigoDireito = dataAccess.SelectLastRight();
                            lblMessage.Text = "<b><font color=#009900>Item \"" + direito.DescricaoDireito + "\" salvo com sucesso!</font></b>";
                            cbTipoDireito.Enabled = true;
                            txtDescricao.Text = "";
                        }
                        else
                            lblMessage.Text = "<b><font color=#990000>Nenhuma linha inserida</font></b>";
                    }
                    InsertModule(direito);

                    LoadDataGrid(txtPesquisa.Text);
                }
                else
                    lblMessage.Text = "<b><font color=#990000>Informe a descrição do direito</font></b>";
            }
            catch (Exception ex)
            {
                lblMessage.Text = "<b><font color=#990000>" + ex.Message + "</font></b>";
            }
        }

        private void InsertModule(Right direito)
        {
            SHA384Managed Alg = new SHA384Managed();
            List<Module> modules = new List<Module>();
            DataAccess dataAccess = new DataAccess();
            CheckBox chkSistema;

            if (tblModules.Rows.Count > 0)
            {
                foreach (HtmlTableCell cell in tblModules.Rows[0].Cells)
                {
                    if (cell.Controls.Count > 0 && cell.Controls[0] is CheckBox)
                    {
                        chkSistema = cell.Controls[0] as CheckBox;

                        if (chkSistema.Checked)
                            modules.Add(new Module()
                            {
                                CodigoDireito = direito.CodigoDireito,
                                CodigoTipoDireito = direito.CodigoTipoDireito,
                                Sigla = chkSistema.ID,
                                TextoHash = Convert.ToBase64String(Alg.ComputeHash(Encoding.ASCII.GetBytes(direito.CodigoDireito + "/" + direito.CodigoTipoDireito + "/" + chkSistema.ID)))
                            });
                    }
                }

                dataAccess.InsertModule(modules);
            }
        }

        private bool ValidateModule()
        {
            bool validate = false;

            if (tblModules.Rows.Count > 0)
            {
                foreach (HtmlTableCell cell in tblModules.Rows[0].Cells)
                {
                    if (cell.Controls.Count > 0 && cell.Controls[0] is CheckBox)
                    {
                        if ((cell.Controls[0] as CheckBox).Checked)
                        {
                            validate = true;
                            break;
                        }
                    }
                }

                if (!validate)
                    lblMessage.Text = "<b><font color=#990000>Informe pelo menos um módulo para o direito</font></b>";
            }

            return validate;
        }

        void DeleteItems()
        {
            try
            {
                if (!String.IsNullOrEmpty(hdnSelected.Value))
                {
                    string[] comma = hdnSelected.Value.Split(',');

                    List<Right> direitos = new List<Right>();

                    foreach (string s in comma)
                    {
                        direitos.Add(new Right(Convert.ToInt32(s)));
                    }

                    if (direitos.Count > 0)
                    {
                        // Apaga os módulos dos direitos selecionados
                        new DataAccess().DeleteModule(direitos);

                        int linhasAfetadas = new DataAccess().DeleteRights(direitos);
                        if (linhasAfetadas > 0)
                        {
                            if (linhasAfetadas == 1)
                                lblMessage.Text = "<b><font color=#009900>" + linhasAfetadas.ToString() + " item deletado com sucesso!</font></b>";
                            else
                                lblMessage.Text = "<b><font color=#009900>" + linhasAfetadas.ToString() + " itens deletados com sucesso!</font></b>";
                        }
                        else
                            lblMessage.Text = "<b><font color=#990000>Nenhuma linha deletada</font></b>";
                    }
                    else
                        lblMessage.Text = "<b><font color=#990000>Nenhum item selecionado para exclusão!</font></b>";
                }
                else
                    lblMessage.Text = "<b><font color=#990000>Nenhum item selecionado para exclusão!</font></b>";
            }
            catch (Exception ex)
            {
                lblMessage.Text = "<b><font color=#990000>" + ex.Message + "</font></b>";
            }
        }

        protected void btnPesquisar_Click(object sender, EventArgs e)
        {
            LoadDataGrid(txtPesquisa.Text.Trim());
            grdRights.PageIndex = 0;
        }

        protected void grdRights_Sorting(object sender, GridViewSortEventArgs e)
        {
            DataTable dt = grdRights.DataSource as DataTable;

            if (dt != null)
            {
                //DataView dataView = new DataView(dt);
                //dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

                //dt.DataSource = dataView;
                //dt.DataBind();
            }
        }
    }
}